supce's blog

CSS Secret 读书笔记之半透明与多重边框

半透明边框

由于背景色会侵入到边框所在的范围,如果想要半透明的边框,可以使用background-clip属性。这个属性规定背景的绘制区域,其初始值为border-box,如果将属性值设置为padding-box,背景就会被裁剪到内边距框。
HTML代码:

<div class="parent">
    <div class="test">
        this is a test
    </div>
</div>

CSS代码:

.parent{
    width: 200px;
    height: 200px;
    background: deepskyblue;
    display: flex;
}
.test{
    margin: 50px auto;
    padding: 0;
    width: 50px;
    height: 50px;
    border: 10px solid hsla(0,0%,100%,.5);
    background: white;
    background-clip: padding-box;
}

效果如下:

多重边框

想要使用多重边框,但是又不想添加无用的额外元素破坏HTML结构。可以使用box-shadow或者outline来模拟多重边框。

box-shadow方案

想要模拟多重边框,可以利用box-shadow的第四个参数,用来设置阴影的尺寸。一个正值的阴影加上两个为零的偏移量以及为零的模糊值,得到的效果就像一道实线的边框。

恰巧,box-shadow支持都好分隔语法,可以创建任意数量的阴影。

于是可以模拟出多重边框。例如:
HTML代码:

<div class="box-shadow-test"></div>

CSS代码:

.box-shadow-test{
    margin: 50px auto;
    padding: 0;
    width: 50px;
    height: 50px;
}
.box-shadow-test{
    background: #6b0;
    box-shadow: 0 0 0 5px #655,
    0 0 0 10px deeppink,
    0px 2px 5px 15px rgba(0,0,0,.6);
}

效果如下:

outline方案

box-shadow虽然可以模拟边框,但是有一个缺陷,就是只能模拟实线边框,不能模拟出虚线边框。而且,可以设置outline-offset属性来控制它和元素边缘之间的间距,如果设置成负值可以模拟出缝边效果。比如:
HTML代码:

<div class="outline-a"></div>

CSS代码:

.outline-a{
        margin: 50px auto;
        padding: 0;
        width: 50px;
        height: 50px;
        background: yellowgreen;
        border: 10px solid #655;
        outline: 1px dashed deeppink;
        outline-offset: -5px;
        border-radius: 5px;
    }

效果如下:

可以看出来,使用outline方案,适用于两层边框的场景。如果需要更多的边框,只能使用box-shadow方案了。

outline还有一个缺陷,outline模拟的边框并不能贴合border-radius产生圆角。比如:

代码:

<div class="outline-b"></div>
.outline-b{
    margin: 50px auto;
    padding: 0;
    width: 50px;
    height: 50px;
    background: yellowgreen;
    border: 10px solid #655;
    outline: 5px solid deeppink;
    border-radius: 5px;
}

效果如下: